package com.jhy.study2.IO;


import java.io.*;
import java.nio.charset.Charset;
import java.util.SortedMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 * @author: robert
 * @description: 解压缩多个文件练习
 * @date: 2021/8/23 18:59
 * @return
 */
public class MultiFileUnZip1 {
    public static void main(String[] args) throws Exception {
        unzipMulFile();
//        Test05();

    }


    public static void unzipMulFile() throws IOException {
        File file = new File("D://testIO.zip");  //定义要解压的文件名称
//        File file = new File("D://multiZip1.zip");  //定义要解压的文件名称
//        File outfile = new File("D://testIO2");  //定义输出文件夹的路径(其实这个输出路径需要从要解压的文件中读取的，所以这里不固定，只需先声明)
        File outfile = null;
        //1.构建输入输出流
        InputStream input = null; // 定义输入流，读取每一个ZipEntry
        ZipEntry zipEntry = null; // 每一个压缩实体
        OutputStream out = null;  // 定义输出流，用于输出每一个实体内容
        //实例化 ZipFile对象
        ZipFile zipFile = new ZipFile(file);  //新东西，import java.util.zip.ZipFile;
        //定义压缩输入流
        ZipInputStream zipInputStream = null;
        zipInputStream = new ZipInputStream(new FileInputStream(file));  //实例化压缩输入流

        //2.遍历压缩包中的文件
        while((zipEntry = zipInputStream.getNextEntry()) != null){  //得到每一个压缩实体
            System.out.println("正在解压 "+zipEntry.getName() +" ..." );
            outfile = new File("D://testIO2//" + zipEntry.getName()); //定义输出的文件路径

            //3.对拼接的输出路径进行逻辑处理
            if(!outfile.getParentFile().exists()){//如果父文件不存在，这里的file可以是文件夹也可以是文件（当然这里指文件路径--文件夹）
                outfile.getParentFile().mkdirs();
            }
            if(!outfile.exists()){//如果文件路径不存在（只有文件路径存在了，我们才可以将流文件数据写到这个文件上）
                if(outfile.isDirectory()){
                    outfile.mkdirs();
                    System.out.println("创建目录。。。");
                }
                if(outfile.isFile()){
                    outfile.createNewFile();
                    System.out.println("创建文件。。。");
                }

            }
            if(!zipEntry.isDirectory()){//如果读取到的压缩实体不是文件夹
                input = zipFile.getInputStream(zipEntry);  //得到每一个压缩体具体的输入流
                out = new FileOutputStream(outfile);   //实例化文件输出流
                int temp = 0;
                while((temp = input.read()) != -1){
                    out.write(temp);
                }
                input.close();
                out.close();

            }



        }
        input.close();
        System.out.println("解压完成。。。");

    }

    public static void Test05(){//获得字符集并输出
        SortedMap<String, Charset> so = Charset.availableCharsets();
        for (String s : so.keySet()) {
            System.out.println(s + "\t" + so.get(s));
        }
    }


}
